<?php
/**
 * @brief Klasa kontrolera auth
 *
 * Klasa odpowiedzialna za rejestrację, logowanie i czynności z nimi powiązane.
 * 
 */
class AuthController extends Zend_Controller_Action
{
    /**
     * @brief Standardowa metoda poprzedzająca działanie akcji.
     * 
     * Przed wykonaniem akcji, przekazywany jest do wyświetlenia widok pomocniczy
     * nagłówka strony oraz pobierane są wiadomości z flashMessengera.
     */
    public function preDispatch()
    {
        $this->view->render('utility/_headbox.phtml');
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $this->_flashMessenger->getMessages();
    }    

    /**
     * @brief Akcja index
     * 
     * Nic nie robi praktycznego - ozdoba. Przekierowuje do akcji login.
     */
    public function indexAction()
    {
        $this->_helper->flashMessenger->addMessage("warning/Zaloguj się!");
        $this->_helper->redirector('login');
    }
    /**
     * @brief Akcja login
     * 
     * Tylko wyświetla formularz logowania. Istnieje druga akcja wykonująca logowanie.
     */
    public function loginAction()
    {
        
        
        $this->view->form = new Application_Form_Login();
        
    }
    /**
     * @brief Akcja logout
     * 
     * Jak nazwa wskazuje służy do wylogowania się.
     * Usuwa dane z instancji klasy Zend_Auth.
     */
    public function logoutAction()
    {
        $entity = Zend_Auth::getInstance();
        $entity->clearIdentity();
        
        $this->_helper->flashMessenger->addMessage("success/Zostałeś wylogowany");
        $this->_helper->redirector('login');
    }

    /**
     * @brief Akcja signup
     * 
     * Akcja umożliwia rejestrację w systemie nowym użytkownikom.
     */
    public function signupAction()
    {
        // sprawdzenie czy osoba rejestrująca się jest zalogowana
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()){
            $this->_helper->flashMessenger->addMessage("warning/Posiadasz już założone konto!");
            $this->_helper->redirector('index','auctions');
        }
        //przekazanie do widoku formularza
        $form = new Application_Form_Signup();
        $this->view->form = $form;
        $request = $this->getRequest();
        //zapisanie danych z formularza do bazy danych
        if ($this->getRequest()->isPost()) {
            if ($form->isValid($request->getPost())) {
               $values = $form->getValues(); 
               //tworzenie noweg obiektu jednsotki rynkowej
               $entity = new Application_Model_MarketEntity();
               $mapper = new Application_Model_MarketEntityMapper();

                //uzupełnianie obiektu
                $entity->setLogin($values['login']);
                $entity->setEmail($values['email']);
                $entity->setName($values['name']);
                $entity->setName2($values['name2']);
                $entity->setSurname($values['surname']);
                $entity->setRole('user');
                
                $salt = $this->salt();
                $entity->setSalt($salt);
                $entity->setPassword(sha1($values['password'].$salt));
                
                //adres pochodzi z subformularza więc jest w formie tablicy
                $entity->setAddress($values['address']);


               //zapis w bazie danych
               $mapper->save($entity);
               $this->_helper->flashMessenger->addMessage("success/Rejestracja zakończona pomyślnie. Zaloguj się!");
               $this->_helper->redirector('login');
                }
                $this->_helper->flashMessenger->addMessage("error/Jedno lub więcej pół zostało błędnie wypełnione"); 
                
            }
    }
  
    /**
     * @brief Akcja process login
     * 
     * Akcja przetwarzająca logowanie.
     * Jeżeli użytkownik używa jej, bo chciał złożyć ofertę
     * to odpowiednie informacje zostaną dopisane do sesji, aby
     * czynność ta była możliwa od razu po zalogowaniu.
     * 
     */
    public function processLoginAction()
    {
        $form = new Application_Form_Login();
        $request = $this->getRequest();
        //modyfikacja sesji jak konieczna.
        $temp = new Zend_Session_Namespace('temp');
        if(isset($temp->auction_id)){
            $auction_id = $temp->auction_id;
            $temp->unsetAll();
            $temp->auction_id = $auction_id;
            $temp->setExpirationHops(4,'auction_id');
        }
        //tu zayczna się logowanie
        if ($request->isPost()){
            if($form->isValid($request->getPost())){
                
                $values = $form->getValues();
                //pozyskanie adaptera do logowania
                $authAdapter = $this->getAuthAdapter();
                //uzupełnienie danych w adapterze
                $authAdapter->setIdentity($values['login']);
                $authAdapter->setCredential($values['password']);
                //uwierzytelnianie za pomocą adaptera
                $auth = Zend_Auth::getInstance();
                $result = $auth->authenticate($authAdapter);
                
                if($result->isValid()){                   
                    //pobranie i zapisanie wszystkich powiązanych informaacji
                    $entity = $authAdapter->getResultRowObject();
                    $auth->getStorage()->write($entity);
                    if(isset($temp->auction_id)){
                        $this->_helper->redirector('make-offer','mymca');
                    }
                    $this->_helper->flashMessenger->addMessage("success/Logowanie zakończone powodzeniem!");
                    $this->_helper->redirector('index','mymca');
                    
                } 
                
            }
        }
        $this->_helper->flashMessenger->addMessage("error/Logowanie zakończone niepowodzeniem!");
        $this->_helper->redirector('login');
    }
    
    /**
     * @brief Standardowa metoda wykonywana po zakończeniu wykonywania akcji.
     * 
     * Umożliwia wyświetlenie stopki strony.
     */
    public function postDispatch()
    {
        $this->view->render('utility/_footbox.phtml');
        
    }
    
    /**
     * @brief Metoda generująca sól do zabezpieczania hasła
     * 
     * return string $salt sól
     */
    private function salt()
    {
        $salt = '';
        
        for( $i = 0 ; $i < 32 ; $i++)
        {
           
            $salt .= chr(rand(33,126));
            
        }
            
        return $salt;
        
    }
    
    /**
     * @brief Metoda zwracająca klasę adapter do logowania.
     * 
     * Klasa tego typu zachowuje się jak klasa tabeli. Może pobierać dane z
     * bazy danych. Oprócz tego posiada dodatkowe metody do weryfikacji danych.
     * 
     * @return Zend_Auth_Adapter_DbTable adapter 
     */
    private function getAuthAdapter()
    {
        $dbAdapter = Zend_Db_Table::getDefaultAdapter();
        $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
        
        $authAdapter->setTableName('MarketEntity');
        $authAdapter->setIdentityColumn('login');
        $authAdapter->setCredentialColumn('password');
        $authAdapter->setCredentialTreatment('SHA1(CONCAT(?,salt))');
        
        return $authAdapter;
    }
}







